package com.baizhi;


import com.baizhi.dao.CmfzGuruDao;
import com.baizhi.entity.CmfzGuru;
import lombok.val;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;


@RunWith(SpringRunner.class)
@SpringBootTest(classes=CmfzdemoApplication.class)
public class testDemo {


    @Resource
    private CmfzGuruDao cmfzGuruDao;

    @Test
    public void test1() throws IOException {

        List<CmfzGuru> guruList = cmfzGuruDao.selectList(null);
        for (CmfzGuru cmfzGuru : guruList) {

        System.out.println(cmfzGuru);
        }
        /**
         * 先写入 标题栏数据
         */
        String[] titles = new String[]{"上师编号","上师图片地址", "上师姓名", "上师法名", "上师状态"};
//         1.创建文件对象
        HSSFWorkbook workbook = new HSSFWorkbook();

//         2.创建表对象
        HSSFSheet sheet = workbook.createSheet("guru");
//        3.创建标题栏
        HSSFRow titleRow = sheet.createRow(0);

//        4.在标题栏中写入数据

        for (int i = 0; i <titles.length; i++) {
            HSSFCell cell = titleRow.createCell(i);
            cell.setCellValue(titles[i]);
        }
        /**
         * 写入上师数据
         */
        for (int i = 1; i <=guruList.size() ; i++) {
//            创建行
            HSSFRow row = sheet.createRow(i);
//            将上师数据写入到行中
            CmfzGuru cmfzGuru = guruList.get(i-1);

            HSSFCell cell = row.createCell(0);
            cell.setCellValue(cmfzGuru.getGuruId());

            row.createCell(1).setCellValue(cmfzGuru.getGuruImage());

            row.createCell(2).setCellValue(cmfzGuru.getGuruName());


            row.createCell(3).setCellValue(cmfzGuru.getGuruNickname());

            row.createCell(4).setCellValue(cmfzGuru.getGuruStatus());
        }

//        文件保存本地
        workbook.write(new FileOutputStream("F://框架阶段//上师demo.xls"));
    }


    @Test
    public void test2() throws IOException {
//        1.通过流读取Excel文件
        FileInputStream inputStream = new FileInputStream("F://框架阶段//上师demo.xls");
//        2.通过POI解析流 HSSFWorkbook 处理流得到的对象中  就封装了Excel中的所有数据
        HSSFWorkbook workbook = new HSSFWorkbook(inputStream);

//        3.从文件中获取对象 getSheetAt通过下标获取
        HSSFSheet sheet = workbook.getSheetAt(0);
//        4.从表中获取到行数据  从第二行开始 到 最后一行  getLastRowNum()  获取最后一行的下标
        int lastRowNum = sheet.getLastRowNum();

        for (int i = 1; i <=lastRowNum ; i++) {
//            通过下标获取行
            HSSFRow row = sheet.getRow(i);

//            从行中获取数据
            HSSFCell cell = row.getCell(0);

            double id = cell.getNumericCellValue();

            String img = row.getCell(1).getStringCellValue();

            String name = row.getCell(2).getStringCellValue();

            String nickname = row.getCell(3).getStringCellValue();

            double status = row.getCell(4).getNumericCellValue();

            CmfzGuru cmfzGuru = new CmfzGuru();
            cmfzGuru.setGuruId((int) id);
            cmfzGuru.setGuruImage(img);
            cmfzGuru.setGuruName(name);
            cmfzGuru.setGuruNickname(nickname);
            cmfzGuru.setGuruStatus((int) status);
            System.out.println(cmfzGuru);
        //将数据添加到数据库
            int i1 = cmfzGuruDao.insert(cmfzGuru);
            System.out.println(i1);
        }

    }

    /**
     * 测试反射
     */
    @Test
    public void test3() throws IllegalAccessException, InvocationTargetException {
        CmfzGuru cmfzGuru = new CmfzGuru();
        cmfzGuru.setGuruId(123);
        cmfzGuru.setGuruName("张三");
        cmfzGuru.setGuruNickname("坎坎坷坷");
        cmfzGuru.setGuruImage("1.jpg");
        cmfzGuru.setGuruStatus(0);

//        1.获取类对象的三种方式  通过类对象可以获取当前类的属性信息(属性对象)和方法信息
        Class<? extends CmfzGuru> guruClass = cmfzGuru.getClass();

        /**
         * 获取类的属性信息
         * getField() 参数属性名  获取指定的属性名的属性对象
         * getFields() 获取所有公开的属性
         *
         * getDeclaredField() 获取声明的所有属性对象
         *
         */

        Field[] fields = guruClass.getDeclaredFields();

        for (Field field : fields) {
//            通过属性对象 获取属性的值
//            设置打开私有属性的访问权限
            field.setAccessible(true);
//            get() 获取对象的值  参数为要被获取的参数对象 要获取那个对象中的值
            Object o = field.get(cmfzGuru);

//            System.out.println(o);
        }
        /**
         * 获取方法的信息
         *
         * getMethods() 获取公开的方法
         *
         * getDeclaredMethod()  获取声明的所有的方法
         */
        Method[] methods = guruClass.getMethods();

        for (Method method : methods) {
            /**
             * 要获取属性 只要get方法
             *
             * getName() 获取方法名
             *
             * 怎么筛选出来get方法呢 通过字符串校验 getGuruId
             *
             *
             *
             *
             */
            String name = method.getName();
            if(name.contains("getGuru")){
//                获取所有的get方法 就可以调用get方法 得到方法的返回值
                /**
                 * invoke() 调用方法
                 *参数一: 要调用哪个对象的方法
                 * 参数二: 调用方法要传入的参数 get方法没有参数
                 */
                Object invoke = method.invoke(cmfzGuru, null);

                System.out.println(invoke);

            }

        }
    }

}
